package com.br.fsm.projectdelivery.repositorio;

import java.util.ArrayList;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Log;

import com.br.fsm.projectdelivery.activity.R;
import com.br.fsm.projectdelivery.basica.Endereco;
import com.br.fsm.projectdelivery.basica.Usuario;
import com.br.fsm.projectdelivery.basica.Usuario.Usuarios;
import com.br.fsm.projectdelivery.excecao.RepositorioException;
import com.br.fsm.projectdelivery.util.Constantes;
import com.br.fsm.projectdelivery.util.Util;

public class RepositorioUsuario extends RepositorioBasico implements IRepositorioUsuario {

	private static RepositorioUsuario instance;	
	
	public static final String TABLE_NAME = "USUARIO";
	
	public static RepositorioUsuario getInstance(){
		if ( instance == null ){
			instance =  new RepositorioUsuario();
		} 
		return instance;
	}
	
	@Override
	public Usuario getUsuarioById(int id) throws RepositorioException {
		Cursor cursor = null;
		
		Usuario usuario = null;
		
		try {
			cursor = db.query(TABLE_NAME, Usuario.getColumns(), Usuarios.ID + " = " + id , null,
					null, null, null, null);
			
			if (cursor.moveToFirst()) {
				
				usuario = new Usuario();
				
				int idxId = cursor.getColumnIndex(Usuarios.ID);
				int idxEndereco = cursor.getColumnIndex(Usuarios.ENDERECO);
				int idxNome = cursor.getColumnIndex(Usuarios.NOME);
				int idxRg = cursor.getColumnIndex(Usuarios.RG);
				int idxCpf = cursor.getColumnIndex(Usuarios.CPF);
				int idxEmail = cursor.getColumnIndex(Usuarios.EMAIL);
				int idxLogin = cursor.getColumnIndex(Usuarios.LOGIN);
				int idxSenha = cursor.getColumnIndex(Usuarios.SENHA);
				int idxUltimaAlteracao = cursor.getColumnIndex(Usuarios.ULTIMAALTERACAO);
								
				usuario.setUsuarioId(cursor.getInt(idxId));
				
				Endereco endereco = RepositorioEndereco.getInstance().getEnderecoById(cursor.getInt(idxEndereco));
				usuario.setEndereco(endereco);				
				
				usuario.setUsuarioNome(cursor.getString(idxNome));
				usuario.setUsuarioRg(cursor.getString(idxRg));
				usuario.setUsuarioCpf(cursor.getString(idxCpf));
				usuario.setUsuarioEmail(cursor.getString(idxEmail));
				usuario.setUsuarioLogin(cursor.getString(idxLogin));
				usuario.setUsuarioSenha(cursor.getString(idxSenha));
				usuario.setUsuarioUltimaAlteracao(Util.convertDateStrToDate(cursor.getString(idxUltimaAlteracao)));
			}
		} catch (Exception e) {
			e.printStackTrace();
			Log.e( Constantes.CATEGORIA , e.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return usuario;
	}

	@Override
	public ArrayList<Usuario> getAllUsuario() throws RepositorioException {
		Cursor cursor = null;
		
		ArrayList<Usuario> usuarios = null;
		try {
			usuarios = new ArrayList<Usuario>();
			cursor = db.query(TABLE_NAME, Usuario.getColumns(), null , null,
					null, null, null, null);
			
			if (cursor.moveToFirst()) {
				
				int idxId = cursor.getColumnIndex(Usuarios.ID);
				int idxEndereco = cursor.getColumnIndex(Usuarios.ENDERECO);
				int idxNome = cursor.getColumnIndex(Usuarios.NOME);
				int idxRg = cursor.getColumnIndex(Usuarios.RG);
				int idxCpf = cursor.getColumnIndex(Usuarios.CPF);
				int idxEmail = cursor.getColumnIndex(Usuarios.EMAIL);
				int idxLogin = cursor.getColumnIndex(Usuarios.LOGIN);
				int idxSenha = cursor.getColumnIndex(Usuarios.SENHA);
				int idxUltimaAlteracao = cursor.getColumnIndex(Usuarios.ULTIMAALTERACAO);
									
				do {
					Usuario usuario = new Usuario();
					
					usuario.setUsuarioId(cursor.getInt(idxId));
					
					Endereco endereco = RepositorioEndereco.getInstance().getEnderecoById(cursor.getInt(idxEndereco));
					usuario.setEndereco(endereco);				
					
					usuario.setUsuarioNome(cursor.getString(idxNome));
					usuario.setUsuarioRg(cursor.getString(idxRg));
					usuario.setUsuarioCpf(cursor.getString(idxCpf));
					usuario.setUsuarioEmail(cursor.getString(idxEmail));
					usuario.setUsuarioLogin(cursor.getString(idxLogin));
					usuario.setUsuarioSenha(cursor.getString(idxSenha));
					usuario.setUsuarioUltimaAlteracao(Util.convertDateStrToDate(cursor.getString(idxUltimaAlteracao)));
					
					usuarios.add(usuario);
				} while (cursor.moveToNext());
				
			}
		} catch (Exception e) {
			e.printStackTrace();			
			Log.e( Constantes.CATEGORIA, e.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return usuarios;
	}

	@Override
	public void insertUsuario(Usuario usuario)
			throws RepositorioException {
		ContentValues values = new ContentValues();

		values.put(Usuarios.ENDERECO, usuario.getEndereco().getEnderecoId());
		values.put(Usuarios.NOME, usuario.getUsuarioNome());
		values.put(Usuarios.RG, usuario.getUsuarioRg());
		values.put(Usuarios.CPF, usuario.getUsuarioCpf());
		values.put(Usuarios.EMAIL, usuario.getUsuarioEmail());
		values.put(Usuarios.LOGIN, usuario.getUsuarioLogin());
		values.put(Usuarios.SENHA, usuario.getUsuarioSenha());
		
		String data = Util.convertDateToDateStr(Util.getCurrentDateTime());
		values.put(Usuarios.ULTIMAALTERACAO, data);

		try {
			db.insert(TABLE_NAME, "", values);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}		
	}

	@Override
	public void updateUsuario(Usuario usuario)
			throws RepositorioException {
		ContentValues values = new ContentValues();

		values.put(Usuarios.ENDERECO, usuario.getEndereco().getEnderecoId());
		values.put(Usuarios.NOME, usuario.getUsuarioNome());
		values.put(Usuarios.RG, usuario.getUsuarioRg());
		values.put(Usuarios.CPF, usuario.getUsuarioCpf());
		values.put(Usuarios.EMAIL, usuario.getUsuarioEmail());
		values.put(Usuarios.LOGIN, usuario.getUsuarioLogin());
		values.put(Usuarios.SENHA, usuario.getUsuarioSenha());
		
		String data = Util.convertDateToDateStr(Util.getCurrentDateTime());
		values.put(Usuarios.ULTIMAALTERACAO, data);

		String _id = String.valueOf(usuario.getUsuarioId());

		String where = Usuarios.ID + "=?";
		String[] whereArgs = new String[] { _id };

		try {
			db.update(TABLE_NAME, values, where, whereArgs);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}
	}

	@Override
	public void removeUsuario(Usuario usuario)
			throws RepositorioException {
		String _id = String.valueOf(usuario.getUsuarioId());

		String where = Usuarios.ID + "=?";
		String[] whereArgs = new String[] { _id };

		try {
			db.delete( TABLE_NAME, where, whereArgs);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}
	}
}
